#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>

int g_val=100;

int main(){
    pid_t id=fork();
    if(id==0){
        //子进程
        int cnt=5;
        while(1){
            printf("I am childprocess,pid : %d, ppid : %d, g_val: %d, &g_val: %p\n",getpid(),getppid(),g_val,&g_val);
            sleep(3);
            if(cnt){
                cnt--;
            }
            else{
                g_val=200;
                printf("childprocess change g_val : 100 -> 200\n");
                cnt--;
            }
        }
    }
    else{
        //父进程
        while(1){
            printf("I am parentprocess,pid : %d, ppid : %d, g_val: %d, &g_val: %p\n",getpid(),getppid(),g_val,&g_val);
            sleep(3);
        }
    }
    return 0;
}





//int g_val_1;
//int g_val_2=100;
//int main(int argc,char *argv[],char *env[]){
//    //代码区地址
//    printf("code addr: %p\n",main);
//
//    //字符常量区地址
//    const char *str="hello world";
//    printf("read only string addr: %p\n",str);
//
//    //已初始化全局变量地址
//    printf("init global value addr: %p\n",&g_val_2);
//
//    //未初始化全局变量地址
//    printf("uninit global value addr: %p\n",&g_val_1);
//
//    //堆区地址
//    char *mem=(char*)malloc(100);
//    printf("heap addr: %p\n",mem);
//
//    //堆区地址向上增长
//    char *mem2=(char*)malloc(100);
//    printf("heap addr: %p\n",mem2);
//    char *mem3=(char*)malloc(100);
//    printf("heap addr: %p\n",mem3);
//    
//
//    //栈区地址
//    printf("stack addr: %p\n",&str);
//
//    //栈区地址向下增长
//    printf("stack addr: %p\n",&mem);
//    int a,b,c;
//    printf("stack addr: %p\n",&a);
//    printf("stack addr: %p\n",&b);
//    printf("stack addr: %p\n",&c);
//    
//    //验证静态变量
//    static int d=100;
//    printf("static addr: %p\n",&d);
//
//    //命令行参数地址
//    int i=0;
//    for(;argv[i];i++){
//        printf("argv[%d]: %p\n",i,argv[i]);
//    }
//
//    //环境变量地址
//    for(i=0;env[i];i++){
//        printf("env[%d]: %p\n",i,env[i]);
//    }
//
//    return 0;
//}
